/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2008，所有权利保留。
 * 
 * 项目名：	rumba-web
 * 文件名：	MessageRecord.java
 * 模块说明：	
 * 修改历史：
 * Jul 17, 2008 - lxm - 创建。
 */
package com.hd123.rumba.gwt.util.client;

import java.util.List;

import com.google.gwt.user.client.ui.Focusable;

/**
 * 消息记录。
 * 
 * @author lxm
 * 
 */
public class MessageRecord {

  private static final long serialVersionUID = 300100L;

  /** 动作{@link #action}取值：添加或修改 */
  public static final String ACTION_PUT = "put";
  /** 动作{@link #action}取值：删除 */
  public static final String ACTION_REMOVE = "remove";

  /** 信息级别 */
  public static final int LEVEL_INFO = 0; // 提示
  public static final int LEVEL_WARNING = 1; // 警告
  public static final int LEVEL_ERROR = 2; // 错误

  private String id;
  private String action = ACTION_PUT;
  private String message;
  private int level = LEVEL_INFO;

  private Focusable focusWidget = null;

  private MessageRecord() {
    super();
  }

  /**
   * 根据一个已存在的MessageRecord创建一个新的，供派生类调用。
   * 
   * @param messageRecord
   */
  protected MessageRecord(MessageRecord messageRecord) {
    this();
    id = messageRecord.getId();
    action = messageRecord.getAction();
    message = messageRecord.getMessage();
    level = messageRecord.getLevel();
    focusWidget = messageRecord.getFocusWidget();
  }

  /**
   * @param id
   *          消息标识
   * @param message
   *          消息内容
   * @param level
   *          消息的级别。取值参见名为“LEVEL_*”的常量。
   * @param action
   *          动作
   * @param focusWidget
   *          消息对应的控件
   */
  private MessageRecord(String id, String message, int level, String action, Focusable focusWidget) {
    this();
    setId(id);
    setMessage(message);
    setLevel(level);
    setAction(action);
    setFocusWidget(focusWidget);
  }

  /**
   * 创建一个添加或修改动作的消息记录。
   * 
   * @param id
   *          消息标识，可以为null。传入一个非空的id可以用来以后修改或删除这条消息。
   * @param message
   *          消息内容
   * @param level
   *          消息的级别。取值参见名为“LEVEL_*”的常量。
   * @param focusWidget
   *          消息对应的控件，可以为null
   * @return
   */
  public static MessageRecord newPut(String id, String message, int level, Focusable focusWidget) {
    return new MessageRecord(id, message, level, ACTION_PUT, focusWidget);
  }

  /**
   * 创建一个添加或修改动作的消息记录。
   * 
   * @param message
   *          消息内容
   * @param level
   *          消息的级别。取值参见名为“LEVEL_*”的常量。
   * @param focusWidget
   *          消息对应的控件，可以为null
   * @return
   */
  public static MessageRecord newPut(String message, int level, Focusable focusWidget) {
    return newPut(null, message, level, focusWidget);
  }

  /**
   * 创建一个添加或修改动作的消息记录。
   * 
   * @param message
   *          消息内容
   * @param level
   *          消息的级别。取值参见名为“LEVEL_*”的常量。
   * @return
   */
  public static MessageRecord newPut(String message, int level) {
    return newPut(message, level, null);
  }

  /**
   * 创建一个添加或修改动作的消息记录。级别默认为LEVEL_INFO
   * 
   * @param message
   *          消息内容
   * @return
   */
  public static MessageRecord newPut(String message) {
    return newPut(message, LEVEL_INFO);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_INFO级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @param focusWidget
   *          消息对应的控件，可以为null
   * @return
   */
  public static MessageRecord newInfo(String message, Focusable focusWidget) {
    return newPut(message, LEVEL_INFO, focusWidget);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_INFO级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @return
   */
  public static MessageRecord newInfo(String message) {
    return newInfo(message, null);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_WARNING级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @param focusWidget
   *          消息对应的控件，可以为null
   * @return
   */
  public static MessageRecord newWarning(String message, Focusable focusWidget) {
    return newPut(message, LEVEL_WARNING, focusWidget);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_WARNING级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @return
   */
  public static MessageRecord newWarning(String message) {
    return newWarning(message, null);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_ERROR级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @param focusWidget
   *          消息对应的控件，可以为null
   * @return
   */
  public static MessageRecord newError(String message, Focusable focusWidget) {
    return newPut(message, LEVEL_ERROR, focusWidget);
  }

  /**
   * 创建一个动作为添加或修改的LEVEL_ERROR级别的消息记录。
   * 
   * @param message
   *          消息内容
   * @return
   */
  public static MessageRecord newError(String message) {
    return newError(message, null);
  }

  /**
   * 创建一个删除动作的消息记录。
   * 
   * @param id
   *          消息标识
   * @return
   */
  public static MessageRecord newRemove(String id) {
    return new MessageRecord(id, null, 0, ACTION_REMOVE, null);
  }

  /**
   * 判断是否在指定的列表中存在info。
   * 
   * @param msgRcds
   *          指定的消息记录列表。List of MessageRecord
   * @return
   */
  public static boolean hasInfo(List msgRcds) {
    return hasLevel(msgRcds, LEVEL_INFO);
  }

  /**
   * 判断是否在指定的列表中存在warning。
   * 
   * @param msgRcds
   *          指定的消息记录列表。List of MessageRecord
   * @return
   */
  public static boolean hasWarning(List msgRcds) {
    return hasLevel(msgRcds, LEVEL_WARNING);
  }

  /**
   * 判断是否在指定的列表中存在error。
   * 
   * @param msgRcds
   *          指定的消息记录列表。List of MessageRecord
   * @return
   */
  public static boolean hasError(List msgRcds) {
    return hasLevel(msgRcds, LEVEL_ERROR);
  }

  private static boolean hasLevel(List msgRcds, int level) {
    if (msgRcds == null)
      return false;
    for (int i = 0; i < msgRcds.size(); i++) {
      if (!(msgRcds.get(i) instanceof MessageRecord))
        continue;
      MessageRecord rcd = (MessageRecord) msgRcds.get(i);
      if (level == rcd.getLevel()) {
        return true;
      }
    }
    return false;
  }

  /** 标识 */
  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  /** 动作，取值参见名为“ACTION_*”的常量。 */
  public String getAction() {
    return action;
  }

  public void setAction(String action) {
    this.action = action;
  }

  /** 消息。仅当action=ACTION_PUT时有效。 */
  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  /** 消息级别。仅当action=ACTION_PUT时有效。 */
  public int getLevel() {
    return level;
  }

  public void setLevel(int level) {
    this.level = level;
  }

  /** 消息所针对的焦点控件。仅当action=ACTION_PUT时有效。 */
  public Focusable getFocusWidget() {
    return focusWidget;
  }

  public void setFocusWidget(Focusable focusWidget) {
    this.focusWidget = focusWidget;
  }

  /**
   * 定位焦点到focusWidget，派生类可重写此方法，加入新的行为
   * 
   */
  public void focusOnWidget() {
    if (focusWidget != null)
      focusWidget.setFocus(true);
  }
}
